# 字典
# - 符号为：大括号
# - 数据为：键值对 形式出现；字典中的“键”必须是独一无二的
# - 键和值之间用：冒号 隔开

# 字典的 5 种声明方式

# 1. 花括号 {} 直接声明
# print('*' * 30 + '  花括号 {} 直接声明  ' + '*' * 30)
# 特点：简洁直观，适用于静态键值对。
# 使用场景：90% 的日常代码中快速创建字典。
# person = {"name": "Alice", "age": 25, "city": "Beijing"}
# print(person)

# 2. dict() 构造函数
# print('*' * 30 + '  dict() 构造函数  ' + '*' * 30)
# 特点：支持动态生成，键名必须是合法变量名（如不能是数字）。
# 使用场景：键名需动态计算或从其他数据结构转换时。
# person = dict(name= 'Alice',age=25,city='Beijing') # # 关键字参数形式
# person = dict([('name','Alice'),('age',25),('city','Beijing')])
# print(person)

# 3. 字典推导式（Dictionary Comprehension）
# print('*' * 30 + '  3. 字典推导式（Dictionary Comprehension）  ' + '*' * 30)
# 特点：基于循环和条件生成字典，代码紧凑。
# 使用场景：需要批量处理数据时（如列表转字典）。
# squares  = {x:x**2 for x in range(5)} # 键为整数,值为整数的平方
# print(squares)

# 4. fromkeys() 方法 不建议使用
# 特点：统一初始化键值，值相同。
# 使用场景：初始化字典键，后续逐个赋值。
# print()
# print('*' * 30 + '  4. fromkeys() 方法 不建议使用  ' + '*' * 30)
# keys = ["name", "age", "city"]
# default_value = None
# person = dict.fromkeys(keys,  default_value)  # 输出 {'name': None, 'age': None, 'city': None}
# print(person)

# 5. 类型转换（从其他数据结构）
# 特点：依赖现有数据（如元组列表、JSON）。
# 使用场景：数据已结构化存储时（如 API 响应解析）。
# print()
# print('*' * 30 + '  5. 类型转换（从其他数据结构）  ' + '*' * 30)
# key_value_pairs = [("name", "Alice"), ("age", 25)]
# person = dict(key_value_pairs)  # 输出 {'name': 'Alice', 'age': 25}
# print(person)

# 三、特殊场景示例
# 1. 动态键名（需用 dict()）
# dynamic_key = "user_id"
# data = dict(**{dynamic_key: 1001})  # 输出 {'user_id': 1001}
# print(data)
# 2. 合并字典（Python 3.9+）
# dict1 = {"a": 1}
# dict2 = {"b": 2}
# merged = dict1 | dict2  # 输出 {'a': 1, 'b': 2}
# print(merged)
# 3. 默认值字典（collections.defaultdict ）
# from collections import defaultdict
# counts = defaultdict(int)  # 未存在的键默认返回 0
# print(counts)


# # 新增和修改
# dict1['address'] = 'shanghai'
# dict1['age'] = 55
# 1. 直接赋值（最常用） 特点：若键不存在则新增，存在则覆盖。
# person = {'name': 'Alice'}
# person['age'] = 25  # 新增键 age
# print(person)  # 输出 {'name': 'Alice', 'age': 25}
# 2. setdefault() 方法（安全新增）
# 适用场景：避免意外覆盖已有键。
# person = {"name": "Alice"}
# person.setdefault("age",  25)  # 键不存在时新增
# person.setdefault("name",  "Bob")  # 键存在时不修改
# print(person)  # 输出 {'name': 'Alice', 'age': 25}

# 3. update() 批量新增
# 扩展用法：支持传入其他字典或键值对列表。
# person = {"name": "Alice"}
# person.update({"age":18,"city":"Beijing","country":"China"})
# print(person) # 输出 {'name': 'Alice', 'age': 18, 'city': 'Beijing', 'country': 'China'}

# 二、修改键值对
# 1. 直接重新赋值
# person = {"name": "Alice", "age": 25}
# person["age"] = 26  # 修改已有键
# print(person)  # 输出 {'name': 'Alice', 'age': 26}

# 2. update() 批量修改
# person = {"name": "Alice", "age": 25}
# person.update(age=26,  city="Shanghai")  # 修改 age 并新增 city
# print(person)  # 输出 {'name': 'Alice', 'age': 26, 'city': 'Shanghai'}

# 3. 条件修改（字典推导式）
# person = {"name": "Alice", "age": 25}
# person = {k: v + 1 if k == "age" else v for k, v in person.items()}   # 仅修改 age
# print(person)  # 输出 {'name': 'Alice', 'age': 26}

# 三、新增/修改的边界案例
# 1. 键为可变类型（需注意）
# 错误示例：列表不能作为键
# invalid_dict = {["temp"]: "value"}  # 报错 TypeError: unhashable type: 'list'
# 2. 动态键名（使用变量）
# key = "dynamic_key"
# person = {}
# person[key] = "value"  # 键名由变量决定
# print(person)  # 输出 {'dynamic_key': 'value'}
# 3. 链式操作（Python 3.9+）
person = {"name": "Alice"} | {"age": 25}  # 合并字典并新增键
print(person)  # 输出 {'name': 'Alice', 'age': 25}


# 删除
# dict1 = {'name': 'laoxiao', 'age': 34}
# dict1.clear()
# dict1.pop('age')  # 删除并返回 34 （安全删除 + 返回值）
# del dict1['age'] # 风险：键不存在时触发 KeyError
# print(dict1)


# 查询
# dict1 = {'name': 'laoxiao', 'age': 34}
# if 'name' in dict1:
#     print(dict1['name']) # 输出 laoxiao


# 字典中的一些函数
# new_dict = dict.fromkeys(['name', 'age'])
# new_dict['name'] = '王五'
# print(new_dict)

# dict1 = {'name': 'laoxiao', 'age': 34,'address':'Beijing'}
dict1 = {'name': 'laoxiao', 'age': 34}
# print(dict1['address']) # 不存在的时候报错 Traceback (most recent call last):
# print(dict1.get('address')) # 不存在时候 输出 None
# print(dict1)

# 字典的遍历
# items把所有的向放到一个列表中
# for k, v in dict1.items():
#     # print(k, v)
#     print(f'k = {k}, v = {v}')
# print()
# for k in dict1.keys():
#     print(f'k = {k}')
# print()
# for v in dict1.values():
#     print(f'v = {v}')
